#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

double dp[105][105]; // dp[i][j]代表第i轮走到第j号格子的概率

int main()
{
    int Back[105], Lose[105], N, T, L, B, index;
    while (scanf("%d%d%d%d", &N, &T, &L, &B) != EOF)
    {
        if (N == 0 && T == 0 && L == 0 && B == 0)
        {
            break;
        }
        memset(dp, 0, sizeof(dp));
        memset(Back, 0, sizeof(Back));
        memset(Lose, 0, sizeof(Lose));
        for (int i = 0; i < L; i++)
        {
            scanf("%d", &index);
            Lose[index] = 1; // 要停止一次的格子的编号
        }
        for (int i = 0; i < B; i++)
        {
            scanf("%d", &index);
            Back[index] = 1; // 要返回的格子的编号
        }
        dp[0][0] = 1;
        for (int i = 0; i < T; i++)
        {
            for (int j = N - 1; j >= 0; j--)
            {
                if (dp[i][j] == 0) // 如果第i轮到达j号格子的概率为0，则直接忽略
                {
                    continue;
                }
                if (Back[j] == 1)
                { // 走到j号格子要返回0号格子，则第i步走到0号格子的概率加上dp[i][j]
                    dp[i][0] += dp[i][j];
                }
                else
                {
                    if (Lose[j] == 1) // 如果走到j号格子要停止一次，直接跳过第i + 1轮
                    {
                        for (int k = 1; k <= 6; k++)
                        {
                            if (j + k <= N)
                            {
                                dp[i + 2][j + k] += dp[i][j] / 6;
                            }
                            else
                            { // 如果走到超过最大值N，则从N开始后退
                                dp[i + 2][2 * N - j - k] += dp[i][j] / 6;
                            }
                        }
                    }
                    else
                    {
                        for (int k = 1; k <= 6; k++)
                        {
                            if (j + k <= N)
                            {
                                dp[i + 1][j + k] += dp[i][j] / 6;
                            }
                            else
                            {
                                dp[i + 1][2 * N - j - k] += dp[i][j] / 6;
                            }
                        }
                    }
                }
            }
        }
        double ans = 0;
        // 从第1轮到第T轮到达终点的概率之和，因为每一轮都有可能到达终点
        for (int i = 1; i <= T; i++)
        {
            ans += dp[i][N];
        }
        printf("%.6f\n", ans);
    }
    return 0;
}